package com.treetao.union.core.util;

import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;

import lombok.extern.slf4j.Slf4j;

@Slf4j
public class ImageMarkUtil {
	 /** 水印透明度 */  
    private static float alpha = 0.5f;  
    /** 水印图片旋转角度 */  
    private  double degree = 0f;  
    private  int interval = 0;  
    
    // 水印文字字体
    private static Font font = new Font("宋体", Font.PLAIN, 20);
    // 水印文字颜色
    private static Color color = Color.WHITE;
  
    /** 
     * 设置水印参数，不设置就使用默认值 
     *  
     * @param alpha 
     *            水印透明度 
     * @param degree 
     *            水印图片旋转角度 * 
     * @param interval 
     *            水印图片间隔 
     */  
    public  void setImageMarkOptions(float alpha, int degree,  
            int interval) {  
        if (alpha != 0.0f) {  
            this.alpha = alpha;  
        }  
        if (degree != 0f) {  
        	this.degree = degree;  
        }  
        if (interval != 0f) {  
        	this.interval = interval;  
        }  
  
    }  
  
    /** 
     * 给图片添加水印图片 
     *  
     * @param waterImgPath 
     *            水印图片路径 
     * @param srcImgPath 
     *            源图片路径 
     * @param targerPath 
     *            目标图片路径 
     */  
    public  void waterMarkByImg(String waterImgPath, String srcImgPath,  
            String targerPath) throws Exception {  
        waterMarkByImg(waterImgPath, srcImgPath, targerPath, 0);  
    }  
  
    /** 
     * 给图片添加水印图片 
     *  
     * @param waterImgPath 
     *            水印图片路径 
     * @param srcImgPath 
     *            源图片路径 
     * @param targerPath 
     *            目标图片路径 
     */  
    public  void waterMarkByImg(String waterImgPath, String srcImgPath) {  
        try {  
            waterMarkByImg(waterImgPath, srcImgPath, srcImgPath, 0);  
        } catch (Exception e) {  
            // TODO Auto-generated catch block  
            e.printStackTrace();  
        }  
    }  
  
    /** 
     * 给图片添加水印图片、可设置水印图片旋转角度 
     *  
     * @param waterImgPath 
     *            水印图片路径 
     * @param srcImgPath 
     *            源图片路径 
     * @param targerPath 
     *            目标图片路径 
     * @param degree 
     *            水印图片旋转角度 
     */  
    public  void waterMarkByImg(String waterImgPath, String srcImgPath,  
            String targerPath, double degree) throws Exception {  
        OutputStream os = null;  
        try {  
  
            Image srcImg = ImageIO.read(new File(srcImgPath));  
  
            BufferedImage buffImg = new BufferedImage(srcImg.getWidth(null),  
                    srcImg.getHeight(null), BufferedImage.TYPE_INT_RGB);  
  
            // 1、得到画笔对象  
            Graphics2D g = buffImg.createGraphics();  
  
            // 2、设置对线段的锯齿状边缘处理  
            g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,  
                    RenderingHints.VALUE_INTERPOLATION_BILINEAR);  
            g.drawImage(srcImg.getScaledInstance(srcImg.getWidth(null), srcImg  
                    .getHeight(null), Image.SCALE_SMOOTH), 0, 0, null);  
            // 3、设置水印旋转  
            if (0 != degree) {  
                g.rotate(Math.toRadians(degree),  
                        (double) buffImg.getWidth() / 2, (double) buffImg  
                                .getHeight() / 2);  
            }  
  
            // 4、水印图片的路径 水印图片一般为gif或者png的，这样可设置透明度  
            ImageIcon imgIcon = new ImageIcon(waterImgPath);  
  
            // 5、得到Image对象。  
            Image img = imgIcon.getImage();  
  
            g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,  
                    alpha));  
  
            // 6、水印图片的位置  
            for (int height = interval + imgIcon.getIconHeight(); height < buffImg  
                    .getHeight(); height = height +interval+ imgIcon.getIconHeight()) {  
                for (int weight = interval + imgIcon.getIconWidth(); weight < buffImg  
                        .getWidth(); weight = weight +interval+ imgIcon.getIconWidth()) {  
                    g.drawImage(img, weight - imgIcon.getIconWidth(), height  
                            - imgIcon.getIconHeight(), null);  
                }  
            }  
            g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER));  
            // 7、释放资源  
            g.dispose();  
  
            // 8、生成图片  
            os = new FileOutputStream(targerPath);  
            ImageIO.write(buffImg, "JPG", os);  
  
        } catch (Exception e) {  
            e.printStackTrace();  
        } finally {  
            try {  
                if (null != os)  
                    os.close();  
            } catch (Exception e) {  
                e.printStackTrace();  
            }  
        }  
    }  
    
    /**
     * 给图片添加水印文字
     * 
     * @param logoText
     *            水印文字
     * @param srcImgPath
     *            源图片路径
     * @param targerPath
     *            目标图片路径
     */
    public static void markImageByText(String logoText, String srcImgPath,
            String targerPath) {
        markImageByText(logoText, srcImgPath, targerPath, null);
    }

    /**
     * 给图片添加水印文字、可设置水印文字的旋转角度
     * 
     * @param logoText
     * @param srcImgPath
     * @param targerPath
     * @param degree
     */
    public static void markImageByText(String logoText, String srcImgPath,
            String targerPath, Integer degree) {

        InputStream is = null;
        OutputStream os = null;
        try {
            // 1、源图片
            Image srcImg = ImageIO.read(new File(srcImgPath));
            BufferedImage buffImg = new BufferedImage(srcImg.getWidth(null),
                    srcImg.getHeight(null), BufferedImage.TYPE_INT_RGB);

            // 2、得到画笔对象
            Graphics2D g = buffImg.createGraphics();
            // 3、设置对线段的锯齿状边缘处理
            g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
                    RenderingHints.VALUE_INTERPOLATION_BILINEAR);
            g.drawImage(
                    srcImg.getScaledInstance(srcImg.getWidth(null),
                            srcImg.getHeight(null), Image.SCALE_SMOOTH), 0, 0,
                    null);
            // 4、设置水印旋转
            if (null != degree) {
                g.rotate(Math.toRadians(degree),
                        (double) buffImg.getWidth() / 2,
                        (double) buffImg.getHeight() / 2);
            }
            // 5、设置水印文字颜色
            g.setColor(color);
            // 6、设置水印文字Font
            g.setFont(font);
            // 7、设置水印文字透明度
            g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,
                    alpha));
            // 8、第一参数->设置的内容，后面两个参数->文字在图片上的坐标位置(x,y)
            g.drawString(logoText, buffImg.getWidth()/2-50, buffImg.getHeight()-20);
            // 9、释放资源
            g.dispose();
            // 10、生成图片
            os = new FileOutputStream(targerPath);
            ImageIO.write(buffImg, "JPG", os);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (null != is)
                    is.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
            try {
                if (null != os)
                    os.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

  
    public static void main(String[] args) {  
  
       // System.out.println("..添加水印图片开始...");  
        /** 
         * watermarkPath 水印图片地址 加水印图片地址 上传成功后文件地址 
         */  
        ImageMarkUtil util = new ImageMarkUtil();
        //修改默认参数  
        //util.setImageMarkOptions(0.0f, 0,  
          //      20);  
      /*  String watermarkPath = util.getShuiYinPic("cert.png");  //测试水印图片  
        String imgPath = "C:\\Users\\Dev.M\\Pictures\\pic_03.jpg";//测试需加水印图片  
        util.setImageMarkOptions(0.5f, 10,  50);  
        util.waterMarkByImg(watermarkPath, imgPath);  
        System.out.println("..添加水印图片结束...");  */
     /*   System.out.println("给图片添加水印文字开始...");
        String logoText = "揾食@复印无效";
        String srcImgPath = "C:\\Users\\cunzhang\\Pictures\\3.jpg";
        String targerTextPath = "C:\\Users\\cunzhang\\Pictures\\qie_text.jpg";
        String targerTextPath2 = "C:\\Users\\cunzhang\\Pictures\\/qie_text_rotate.jpg";
        
        // 给图片添加水印文字
        markImageByText(logoText, srcImgPath, targerTextPath);*/
        // 给图片添加水印文字,水印文字旋转-45
      //  markImageByText(logoText, srcImgPath, targerTextPath2, -45);
        System.out.println("给图片添加水印文字结束...");

    }  
    
//    public String getShuiYinPic(String picName) {
//    	 String uri = this.getClass().getResource("/com/devm/framework/util").getPath();
//         return uri+"/"+picName;
//    }
  
    /**
     * 添加小程序专用水印
     */
    public void wirteWxwxCertMark(String localFilePath,String watermarkPath) {
    	// String watermarkPath = getShuiYinPic("cert.png");  //测试水印图片
    	 log.info("水印图片所在位置："+watermarkPath);
    	setImageMarkOptions(0.5f, 10,  50);  
        waterMarkByImg(watermarkPath, localFilePath);  
    }
}
